package com.ecommerce.dddmodules.sharedkernel.service;

import com.ecommerce.dddmodules.sharedkernel.events.ApplicationEvent;
import com.ecommerce.dddmodules.sharedkernel.events.EventBus;
import com.ecommerce.dddmodules.sharedkernel.events.EventSubscriber;
/**
 * @packageName: sharedkernel.service（共享内核.服务包）
 * @className: ApplicationService(应用服务接口)
 * @description: 抽离应用服务接口
 * @author: luds
 * @version: v1.0
 * @date: 2021-04/01
 */
public interface ApplicationService {

	/**
	 * 发布事件（带有默认实现部分）
	 * @param event 事件
	 * @param <E> 继承自应用事件
	 */
	default <E extends ApplicationEvent> void publishEvent(E event) {
		// 获取事件总线
		EventBus eventBus = getEventBus();
		if (eventBus != null) {
			// 把事件发布到事件总线
			eventBus.publish(event);
		}
	}

	/**
	 * 订阅事件（带有默认实现部分）
	 * @param eventType 事件类型
	 * @param subscriber 订阅者
	 * @param <E> 继承自应用事件
	 */
	default <E extends ApplicationEvent> void subscribe(String eventType, EventSubscriber subscriber) {
		// 获取事件总线
		EventBus eventBus = getEventBus();
		if (eventBus != null) {
			// 从事件总线订阅事件
			eventBus.subscribe(eventType, subscriber);
		}
	}

	/**
	 * 退订事件（带有默认实现部分）
	 * @param eventType 事件类型
	 * @param subscriber 订阅者
	 * @param <E> 继承自应用事件
	 */
	default <E extends ApplicationEvent> void unsubscribe(String eventType, EventSubscriber subscriber) {
		// 获取事件总线
		EventBus eventBus = getEventBus();
		if (eventBus != null) {
			// 从事件总线退订事件
			eventBus.unsubscribe(eventType, subscriber);
		}
	}

	/**
	 * 获取事件总线
	 * @return 返回事件总线
	 */
	EventBus getEventBus();

	/**
	 * 设置事件总线
	 * @param eventBus 事件总线
	 */
	void setEventBus(EventBus eventBus);
}
